# 给定一个非空的字符串，判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母，并且长度不超过10000。
#
#  示例 1:
#
#
# 输入: "abab"
#
# 输出: True
#
# 解释: 可由子字符串 "ab" 重复两次构成。
#
#
#  示例 2:
#
#
# 输入: "aba"
#
# 输出: False
#
#
#  示例 3:
#
#
# 输入: "abcabcabcabc"
#
# 输出: True
#
# 解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
#
#  Related Topics 字符串
#  👍 339 👎 0


# leetcode submit region begin(Prohibit modification and deletion)
class Solution:
    def repeatedSubstringPattern(self, s: str) -> bool:
        #         假设满足重复子串构成的，那么 结尾的字符一定是子串的结尾，用双指针依次遍历完字符串即可
        #         可能子串需要

        # n = len(s)
        #
        # # last char ,最后一个字符，如果是重复传，子串的结尾一定是 这个字符
        # lc = s[n - 1]
        #
        # for i in range(0, n // 2):
        #
        #     j = i + 1
        #     k = 0
        #     if s[i] != lc or (n - i + 1) % (i + 1) != 0:
        #         continue
        #     else:
        #         while j <= n - 1 and s[j] == s[k] and k <= i:
        #             j += 1
        #             k += 1
        #             if k > i:
        #                 k = 0
        #
        #         if j == n and k == 0:
        #             return True
        #
        # return False

        # 双倍字符串解法，实则是用了系统库的优化 if s in 这句调用了系统的判断
        # 如果字符串是存在循环子串的，那么去除收尾两个字符后，依然可以在 剩下的串里面 找到 s
        # 反证法，如果 s 不能由子串循环组成， s+s 后 也能找到 子串 s 那么说明
        if not s:
            return False
        if len(s) == 1:
            return False
        t = (s + s)[1:2 * len(s) - 1]
        print(t)
        if s in t:
            return True

    # leetcode submit region end(Prohibit modification and deletion)


print(Solution().repeatedSubstringPattern("abcdef"))
